package com.zhanghs.contentcenter;

import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import org.dom4j.*;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
/**
 * @Author zhanghongshan
 * @date 2021/10/19 8:58 下午
 */
public class OrderToXmlOrder {
    /**
     * 将下单数据  转换 成EDI 数据
     *
     * @param order 订单数据
     * @param User  用户配置数据
     * @return
     * @throws Exception
     */
    public static String outEdiOrder(String order, String User, Integer type) throws Exception {

        Long startLong = System.currentTimeMillis();

        Document ediUserDocument = DocumentHelper.parseText(User);// 用户配置数据
        Element ediUserRoot = ediUserDocument.getRootElement();

        Element Edi = DocumentHelper.createDocument().addElement(ediUserRoot.getName());//  数据
        //
        Out(order, Edi, ediUserRoot, type);
        System.out.println("时间：" + (System.currentTimeMillis() - startLong));
        return Edi.asXML();
    }

    /**
     * 根据 用户配置节点 自动从数据源 查找数据 生成 EDI 数据节点
     *
     * @param order         数据源
     * @param Edi           EDI 数据节点
     * @param requestorders 用户配置节点
     * @param type          1 是 Xml  2 是 json
     */
    public static void Out(String order, Element Edi, Element requestorders, Integer type) throws DocumentException {

        //   Xml 值    <![CDATA[444]]>
        List<Element> listElements = requestorders.elements();
        Document orderDocument = DocumentHelper.createDocument();
        DocumentContext de = null;
        if (type == 1) {
            orderDocument = DocumentHelper.parseText(order);// 订单数据
        } else {
             de = JsonPath.parse(order);
        }
        for (Element e : listElements) {
            getEdiXml(Edi, type, orderDocument, de, e);
        }

    }

    /**
     * 获取 数据源转换成 Edi 的XML
     *
     * @param Edi           EDI Xml
     * @param type          type 1 是 Xml  2 是 json
     * @param orderDocument Xml 数据 源
     * @param de            JSON 数据源
     * @param e             映射数据
     */
    private static void getEdiXml(Element Edi, Integer type, Document orderDocument, DocumentContext de, Element e) {
        // 是否有下级节点

        if (e.nodeCount() != 1) return;

        String TestValuse = e.getTextTrim();
        if (TestValuse == null || TestValuse == "") return;
        //default_   默认值   如果映射表达式 前缀 为default_  那么  后面的 直接赋值
        if (TestValuse.contains("default_")) {
            Edi.addElement(e.getName()).addText(TestValuse.replace("default_", ""));
            return;
        }
        String text = "";
        String[] strings = TestValuse.split(":");
        if (strings.length > 1) {
            text = strings[0] + " : ";
            TestValuse = strings[1];
        }


        // 获取 字段值
        List<String> nodesString = getStrings(type, orderDocument, de, TestValuse);

        //  表达式 判断是否 有    //Udf23[text()=N]   Udf23 节点的值等于 N
        if ("type".equals(e.getName().trim())) {
            if (nodesString.size() == 0) {
                Edi.addElement(e.getName()).addText("0");
                return;
            }
            Edi.addElement(e.getName()).addText("1");
            return;
        }
        orElement(Edi, e, text, nodesString);
    }

    /**
     * EDI Xml  字段值  生成
     *
     * @param Edi         Edi Xml
     * @param e
     * @param text
     * @param nodesString
     */
    private static void orElement(Element Edi, Element e, String text, List<String> nodesString) {
        if (nodesString.size() > 1) {
            for (String et : nodesString)
                text = text + "," + et;
            text = text.substring(1, text.length());
        } else text = text + nodesString.get(0);

        Element element = Edi.element(e.getName());

        if (element != null) {
            if (StringUtils.isEmpty(element.getText())) {
                element.addText(text.trim());
            } else {
                element.addText(" | " + text.trim());
            }
        } else {
            Edi.addElement(e.getName()).addText(text.trim());
        }
    }

    /**
     * 赋值
     *
     * @param type
     * @param orderDocument
     * @param de
     * @param testValuse
     * @return
     */
    private static List<String> getStrings(Integer type, Document orderDocument, DocumentContext de, String testValuse) {
        List<String> nodesString = new ArrayList<>();
        if (type == 1) {
            List<Node> nodesList = orderDocument.selectNodes(testValuse);
            if (nodesList.size() > 0) {
                for (Node ea : nodesList)
                    nodesString.add(ea.getText());
            }
        } else {
            try {
                List<Object> list= de.read(testValuse);
                for (Object o:list)
                    nodesString.add(o.toString());
            } catch (Exception ea) {
                Object o=de.read(testValuse);
                nodesString.add(o.toString());
            }
        }
        return nodesString;
    }

    public static void main(String[] args) {

    }
}
